package com.p04.homework;

/**
 * 狗类
 * extends 继承
 * 继承时 就继承了父类的属性和方法
 *
 *  对象与另一个对象产生关系  ： 耦合
 *  对象与另一个对象少产生关系   解耦
 */
public class Dog extends Animal {
    /**
     * 体重
     */
    public  double weight;

    public Dog() {
    }

    public Dog(String name, String type, String color, int age, double weight) {
        //调用父类的构造方法
        super(name, type, color, age);
        this.weight = weight;
    }

    /**
     * 看门的方法
     */
    public void watchDoor(){
        System.out.println("看门。。");
    }

    /**
     * 方法的重写
     * 重写的规则:
     *
     * 重写的前提: 只有继承关系 或者 实现关系(接口的内容)的时候才能进行方法的重写.
     *
     * 子类的方法的返回值的类型、方法名和形式参数列表>，必须和父类中的是相同的。
     *
     * （在jdk 1.5 以后）子类的返回类（必须要引用数据类型）必须小于等于父类的返回值
     *
     * 注意: 形式参数列表相同: 参数的个数,参数的数据类型,参数的顺序 必须相同
     *
     * 访问修饰符必须不小于父类中的访问修饰符 ( )
     *
     * 子类中重写的异常不能抛出比父类更多的异常
     *
     * @Override（注解） 表示该方法是一个重写的方法
     *
     * 重写一般都使用工具来生成（避免重写方法的错误）
     */
    @Override
    public void sleep(){
        System.out.println("狗狗是趴着睡觉的");
    }

    /**
     * 方法的重写  一般很少这样写
     * @return
     */
    @Override
    public String show() {
        return "子类的重写方法";
    }

    //重写toString

   /* @Override
    public String toString() {
        return this.name;
    }*/

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", type='" + type + '\'' +
                ", color='" + color + '\'' +
                ", age=" + age +
                ", weight=" + weight +
                '}';
    }

    //重写 equals() 相同  ==
    /**
     * == 和 equals()方法的区别
     * == 比较的时地址
     * equals： 如果没有重写equals  equals比较的也是地址
     *         如果重写equals，那么久按照重写的方式来比较
     */
    @Override
    public boolean equals(Object obj) {
         //把object 传唤为一个dog类型
        Dog dog2 = (Dog) obj;
        if(this.name.equals(dog2.name)){
            return true;
        }else{
            return false;
        }
    }
}
